#ifndef ANALYSISSQL_H
#define ANALYSISSQL_H

#include <QObject>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QVector>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QFile>

/**
 * @brief The AnalysisSql class
 * 读写数据库逻辑
 *
 * 数据库表结构:
 *  - id,    病人名称， 检测编号， 检测图像名称， 远程任务编号， 远程任务执行参数，执行状态， 错误信息
 *  - INT     TEXT      TEXT      TEXT        TEXT          TEXT         INT     TEXT
 *  - 主键    非null    非null     非null
 *
 * crud相关函数:
 *  1. 创建病人信息(病人名称，检测编号，检测图像名称) -> id
 *  2. 更新远程任务状态(id, 远程任务编号, 远程任务执行参数, 执行状态, 错误信息)
 *  3. 查询病人-检测编号列表() group_by实现
 *  4. 查询检测图像列表(病人名称，检测编号) -> 检测图像列表, 执行状态, 错误信息
 *  5.
 */

namespace SqlDomain{
    typedef struct AnaDomain{
        int id;
        QString patientName;
        QString testId;
        QString imageName;
        QString taskId;
        QString taskOption;
        int taskStatus;
        QString errMsg;
    }AnalysisDomain;
}


class AnalysisSql : public QObject
{
    Q_OBJECT

public:
    QString sampleDataGenerate();

    SqlDomain::AnalysisDomain createPatient(QString patientName, QString testId, QString imageName);
    bool updateTaskStatus(int id, QString taskId, QString taskOptions, int taskStatus, QString errMsg);
    QVector<SqlDomain::AnalysisDomain> queryDataList();
    QVector<SqlDomain::AnalysisDomain> queryDealList(QString patientName, QString testId);

public:
    static AnalysisSql* instance();
    static void release();

private:
    bool connectSqlLite();
    bool createDatabase();
    explicit AnalysisSql(QObject *parent = nullptr);
    static AnalysisSql* pInstance;
    QSqlDatabase liteDB;

};

#endif // ANALYSISSQL_H
